﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Xml.Linq;
using Microsoft.SharePoint;
using System.Text.RegularExpressions;

namespace LizardSoft.Common.FlexibleStructureDeployment
{
    public static partial class StructureHelper
    {
        /// <summary>
        /// Обработка списка
        /// </summary>
        /// <param name="siteUrl">Url-адрес сайтовой коллекции</param>
        /// <param name="webStrUrl">Адрес веб-сайта относительно сайтовой коллекции</param>
        /// <param name="listProcessingInfo">Информация для обработки списка</param>
        public static void ProcessList(string siteUrl, string webStrUrl, ListProcessingInfo listProcessingInfo)
        {
            if (IsListFolderUrlCorrect(listProcessingInfo))
            {
                SPSite site = null;
                SPWeb web = null;
                try
                {
                    DoActionIfNeeded(siteUrl, webStrUrl, listProcessingInfo, listProcessingInfo.PreAction);

                    site = new SPSite(siteUrl);
                    web = site.OpenWeb(webStrUrl);                    
                    if (!listProcessingInfo.MustBeRemoved)
                    {
                        SetThreadUICulture(new CultureInfo((int)web.Language)); // необходимо для правильного обновления текстовых значений
                        AddOrUpdateList(web, listProcessingInfo);
                        // вызываем обработку, если массив ИД указан
                        if (listProcessingInfo.SiteContentTypeIds != null && listProcessingInfo.SiteContentTypeIds.Count() > 0)
                        {
                            ProcessContentTypes(web, listProcessingInfo);
                        }
                    }
                    else
                    {
                        RemoveListIfNeeded(web, listProcessingInfo);
                    }

                    DoActionIfNeeded(siteUrl, webStrUrl, listProcessingInfo, listProcessingInfo.PostAction);
                }
                catch (Exception ex)
                {
                    throw new Exception(String.Format(
                        "ProcessList '{0}'. Текст ошибки: {1}", listProcessingInfo.ListFolderUrl, ex.ToString()), ex);
                }
                finally
                {
                    if (web != null) web.Dispose();
                    if (site != null) site.Dispose();
                }
            }
            else
            {
                throw new InvalidOperationException(String.Format(
                    "Параметр ListFolderUrl '{0}' некорректен для выбраного шаблона списка", listProcessingInfo.ListFolderUrl));
            }
        }
    }
}
